/**
 * 
 */
package br.edu.unifei.cct720.trabalho07.model.formas;

import java.awt.Color;
import java.util.ArrayList;
import java.util.List;

import br.edu.unifei.cct720.trabalho07.model.ponto.Ponto;


/**
 * Classe que cria uma instancia de um circulo, dados
 * seu ponto central e o valor de seu raio.
 * 
 * @author Felipe Knappe
 */
public class Circulo implements FormaGeometrica {

	/** Armazena o ponto central do circulo */
	private Ponto centro;
	
	/** Armazena o valor do raio do circulo */
	private int raio;
	
	/** Armazena o valor RBG da cor do circulo */
	private Color cor;
	
	/**
	 * Construtor 
	 * 
	 * Cria uma nova instancia da forma geometrica de um circulo,
	 * atraves de seu centro e raio
	 * 
	 * @param centro O ponto central do circulo
	 * @param raio O valor do raio do circulo
	 * @param cor O valor RGB da cor do circulo
	 * 
	 */
	public Circulo(Ponto centro, int raio, Color cor) {
		this.centro = centro;
		this.raio = raio;
		this.cor = cor;
	}

	/**
	 * Metodo responsavel por retornar todos 
	 * os pontos do circulo
	 * 
	 * @return List<Ponto>
	 */
	public List<Ponto> getPontos() {
		
		// Declaracao de variaveis locais
		List<Ponto> pontos = null;
		
		/*
		 *  Obtendo todos os pontos que pertencem ao circulo
		 */
		pontos = getPontosCirculo();
		return pontos;
	}
	
	/**
	 * Metodo responsavel por retornar todos os pontos de um circulo
	 *  
	 * @return List<Ponto>
	 */
	public List<Ponto> getPontosCirculo() {
		
		// Declaracao de variaveis locais
		List<Ponto> pontos = null;
		int xFinal, y = 0;
		
		// Inicializacao de variaveis
		xFinal = (int) Math.round(raio / Math.sqrt(2));
		y = raio;
		pontos = new ArrayList<Ponto>();

		// Loop para preencher lista de pontos da forma geometrica
		for (int x = 0; x <= xFinal; x++) {
			double dA = Math.pow(x + 1, 2) + Math.pow(y, 2) - Math.pow(raio, 2);
			double dB = Math.pow(x + 1, 2) + Math.pow((y - 1), 2) - Math.pow(raio, 2);
			double s = dA + dB;
			
			if (s > 0) 
				y--;			

			pontos.add(new Ponto(centro.getX() + x, centro.getY() + y, cor));
			pontos.add(new Ponto(centro.getX() - x, centro.getY() + y, cor));
			pontos.add(new Ponto(centro.getX() + x, centro.getY() - y, cor));
			pontos.add(new Ponto(centro.getX() - x, centro.getY() - y, cor));
			pontos.add(new Ponto(centro.getX() + y, centro.getY() + x, cor));
			pontos.add(new Ponto(centro.getX() - y, centro.getY() + x, cor));
			pontos.add(new Ponto(centro.getX() + y, centro.getY() - x, cor));
			pontos.add(new Ponto(centro.getX() - y, centro.getY() - x, cor));

		}	
		return pontos;
	}
	
	// Metodos getters e setters
	public Ponto getCentro() {
		return centro;
	}

	public int getRaio() {
		return raio;
	}
		
	public Color getCor() {
		return cor;
	}
}
